<?php
include_once 'users_protoweb.php';

/**
 * @package mailer
 * @subpackage controller
 */
class Users extends Users_protoweb {


  public function __construct() {
    parent::__construct();
  }


  public function index() {
    $this->login();
  }


  /**
   * Generates a cookie in order to identify the user as logged
   */
  public function login() {
    // Assigning messages
    $data['error']    = $this->session->userdata('error');
    $data['success']  = $this->session->userdata('success');
    $data['security'] = $this->session->userdata('security');

    //$this->session->sess_destroy();

    if ($this->input->server('REQUEST_METHOD') === 'POST') {
      // try to login
      $user = new user();
      $user->where('username', $this->input->post('username'));
      $user->where('password', sha1($this->input->post('password')));
      $user->get();

      if ($user->id > 0) {
        // Si el user se logea, entonces limpiaremos el código de activación
        // ya que tal vez en algún momento pidió recordar su contraseña
        //$user->activacion = "";
        //$user->save();

        // setting user and client ID
        $this->session->set_userdata('id', $user->id);
        $this->session->set_userdata('client', $user->permission->client->id);

        redirect(base_url().'users/dashboard/');
      } // end user logged
      
      else { // login failed
        $data['username'] = $this->input->post('username');
        $data['security'] = 'Por favor, revisa tu nombre de usuario y contraseña.';
      }
    } // posting

    $this->smarty_parser->view('user_login.html', $data);

  } // end method login()  

  public function dashboard() {
    // Users Security and selected client
    $data['user']   = $this->security();
    $data['client'] = $this->get_client();

    // Last campaign sent
    $data['last_campaign'] = new Campaign();
    $data['last_campaign']->where('sent >',0)->where_related_client('id',$data['client']->id)->order_by('sent','desc')->limit(1)->get();

    // Get client's templates
    $data['templates'] = new Template();
    $data['templates']->where('client_id', $data['client']->id)->get();

    // Get path to templates
    $data['templates_path'] = $this->config->item("clients_url") . $data['client']->slug . '/templates/';

    // Assigning messages
    $data['error']    = $this->session->userdata('error');
    $data['success']  = $this->session->userdata('success');
    $data['security'] = $this->session->userdata('security');

    // flush message's buffer
    $this->session->set_userdata('error', '');
    $this->session->set_userdata('success', '');
    $this->session->set_userdata('security', '');

    // Activate the corresponding tab option
    $data['active'] = 'dashboard';

    // Make template
    $this->smarty_parser->view('user_dashboard.html', $data);
  } // function dashboard()


  public function create() {

    // empty user
    $data['user'] = new User();

    // If posting, then save
    if ($this->input->server('REQUEST_METHOD') === 'POST')
      $data = $this->edit_save($data['user']->id);
    
    // Make template
    $this->smarty_parser->view('user_edit.html', $data);
  } // function edit()


  public function edit() {
    // Users Security
    $data['user']   = $this->security();
    $data['client'] = $this->get_client();
    
    // If posting, then save
    if ($this->input->server('REQUEST_METHOD') === 'POST')
      $data = $this->edit_save($data['user']->id);
    
    // Activate the corresponding tab option
    $data['active'] = 'profile';

    // Make template
    $this->smarty_parser->view('user_edit.html', $data);
  } // function edit()


  /**
   * Save User  
   * @param id user id
   */
  private function edit_save($id) {
    $data['error'] = '';
    $data['user']  = new User($id);

    $data['user']->lastname  = $this->input->post('lastname');
    $data['user']->firstname = $this->input->post('firstname');
    $data['user']->email     = $this->input->post('email');
    $data['user']->phone     = $this->input->post('phone');
    $data['user']->username  = $this->input->post('username');


    // New user or change password
    if ( ($id === 0) OR ($this->input->post('password') != $data['user']->password) ) 
      $data['user']->password = $this->input->post('password');

    // save and check errors
    if ( ! $data['user']->save()) {

      $data['error'] = $data['user']->error->string;
      
      // if new user, then reset paswword
      if ($id === 0)
        $data['user']->password = '';
      
      return $data;
    }
    else {
      // Set success message and redirect to dashboard
      $this->session->set_userdata('success', '<p>Tus datos se guardaron correctamente.</p>');
      redirect(base_url().'users/dashboard/');
    }
  } // end of method edit_save($id)


  /**
   * Destroys cookie in order to logout an user
   */
  public function logout($msg='<p>Sesión finalizada correctamente.</p>') {
    // delete previous session
    $this->session->sess_destroy();

    // Create an empty session to display the message
    $this->session->set_userdata('success', $msg);

    // redirect to login
    redirect(base_url().'users/login/');

  } // end of method logout($msg)

  /**
   * Envía un email al usuario con un link/código para acceder a su perfil y crear una nueva contraseña
   */
  public function remember() {
    // Assign error message
    $data['error'] = $this->session->userdata('error');

    // flush buffer messages
    $this->session->set_userdata('error', '');
    $this->session->sess_destroy();

    if ($this->input->server('REQUEST_METHOD') === 'POST') {
      // Generamos un usuario vacío
      $user = new User();

      // Try to get the user by username or email
      $user->where('username', $this->input->post('username'));
      $user->or_where('email', $this->input->post('username'));
      $user->get();

      if ($user->id) {
        // Tenemos un usuario! generaremos el código, enviaremos un email y mostraremos un aviso
        $code       = rand(1000, 9999);
        $email_hexa = $this->strToHex($user->email);

        $this->load->library('email');

        // Definimos y enviamos el email
        $this->email->from(
          $this->config->item('admin_email'),
          $this->config->item('admin_name')
        );

        $this->email->to($user->email);

        $this->email->subject('Envío de nueva contraseña');
        $this->email->message("
Hola {$user->nombre},

Hemos recibido un pedido para generarte una nueva contraseña.

Si pediste personalmente recordar tu contraseña, lo único que debes hacer es click aquí: ".base_url()."usuarios/remember_do/{$email_hexa}/{$code}/

Si no habías pedido recordar tu contraseña, no te preocupes, no necesitas hacer nada.

Si crees que alguien más está queriendo acceder a tu cuenta, responde este email contándonos tus sospechas y nosotros te ayudaremos personalmente.

Saludos,
Equipo de mailing
        ");

        $this->email->send();

        // Guardamos el código en la base de datos para poder chequearlo después
        $user->activation = $code;
        $user->save();

        // Mostramos el aviso y reenviamos a login
        $this->session->set_userdata('success', '<p><strong>Te hemos enviado un email</strong> con las instrucciones para reestablecer tu contraseña, por favor, revisa tu correo electrónico.</p>');
        redirect(base_url().'users/login/');
      } // end user

      else { // user failed
        $this->session->set_userdata('error', '<p>El nombre de usuario o el email que ingresaste no existe en nuestra base de datos, por favor, asegurate de haberlo escrito correctamente.</p>');
        $data['error'] = $this->session->userdata('error');
      } // end failed
    } // end posting 

    $this->smarty_parser->view('user_remember.html', $data);

  } // end method remember()


  /**
   * Recibe un email del usuario con su email en hexa y un código para crear una nueva contraseña
   */
  public function remember_do($email_hexa="", $codigo="") {
    $email = $this->hexToStr($email_hexa);

    // buscaremos un usuario que tenga email_hexa y codigo
    $data['user'] = new User();
    $data['user']->where("email",$email);
    $data['user']->where("activation",$codigo);
    $data['user']->get();

    // si ese usuario existe, lo logearemos y llevaremos a su perfil (create) para que elija una nueva contraseña
    if ($data['user']->id) 
      $this->smarty_parser->view('user_remember_do.html', $data);

    // un pequeño control de seguridad
    else {
      // vamos al login
      redirect(base_url()."users/login/");
    }

    // mostrandole un mensaje en la pantalla del perfil
  }

  /**
   * Transforma una cadena string a hexadecimal
   */
  private function strToHex($string) {
    //$string='vieraleonel1@gmail.com';
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
      $hex .= dechex(ord($string[$i]));
    //die($hex)
    return $hex;
  }
  
  /**
   * Transforma una cadena hexadecimal a string
   */
  private function hexToStr($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2)
      $string .= chr(hexdec($hex[$i].$hex[$i+1]));
          
    return $string;
  }

} // class Users

/* End of file users.php */
/* Location: ./system/application/controllers/users.php */